﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DA = AppWeb.Componentes.DAReclamos.Model;

namespace AppWeb.Componentes.DAReclamos.Logic.Facade
{
    public class Reclamo
    {
        public static DA.Reclamo Registrar(DA.Reclamo reclamo)
        {
            var _reclamo = new DA.Reclamo();

            using (DA.ReclamosDataContext _data = new DA.ReclamosDataContext())
            {

                _reclamo = _data.Reclamos.Where(r => r.id.Equals(reclamo.id)).ToList().DefaultIfEmpty(_reclamo).FirstOrDefault();

                _reclamo.analista_id = reclamo.analista_id;
                _reclamo.cliente_id = reclamo.cliente_id;
                _reclamo.punto_venta_id = reclamo.punto_venta_id;
                _reclamo.tipo_id = reclamo.tipo_id;
                _reclamo.fecha_atencion_inicio = reclamo.fecha_atencion_inicio;
                _reclamo.fecha_atencion_final = reclamo.fecha_atencion_final;
                _reclamo.fecha_solucion = reclamo.fecha_solucion;
                _reclamo.descripcion = reclamo.descripcion;
                _reclamo.estado_id = reclamo.estado_id;
                _reclamo.porcentaje_avance = reclamo.porcentaje_avance;
                _reclamo.solucion = reclamo.solucion;
                _reclamo.administrador_id = reclamo.administrador_id;

                if (_reclamo.id == 0)
                {
                    _data.Reclamos.InsertOnSubmit(_reclamo);
                }

                _data.SubmitChanges();

            }

            return _reclamo;
        }

        public static DA.Reclamo ObtenerReclamo(int reclamo_id)
        {

            DA.Reclamo reclamo;

            using (var data = new DA.ReclamosDataContext())
            {
                reclamo = data.Reclamos.FirstOrDefault(r => r.id == reclamo_id);

                var firstOrDefaultCliente = data.Clientes.FirstOrDefault(c => c.id == reclamo.cliente_id);
                if (firstOrDefaultCliente != null)
                {
                    reclamo.documento_identidad_numero = firstOrDefaultCliente.documento_identidad_numero;
                    reclamo.nombres = firstOrDefaultCliente.nombres;
                    reclamo.apellidos = firstOrDefaultCliente.apellidos;

                }

                var firstOrDefaultTipo = data.Tipo_Reclamos.FirstOrDefault(rt => rt.id == reclamo.tipo_id);
                if (firstOrDefaultTipo != null)
                {
                    reclamo.tipo_reclamo_nombre = firstOrDefaultTipo.nombre;
                }

                var firstOrDefaultEstado = data.Estado_Reclamos.FirstOrDefault(re => re.id == reclamo.estado_id);
                if (firstOrDefaultEstado != null)
                {
                    reclamo.estado_reclamo_nombre = firstOrDefaultEstado.nombre;
                }

                var firstOrDefaultPunto_Ventas = data.Punto_Ventas.FirstOrDefault(pv => pv.id == reclamo.punto_venta_id);
                if (firstOrDefaultPunto_Ventas != null)
                {
                    reclamo.punto_venta_nombre = firstOrDefaultPunto_Ventas.nombre;
                }

                var firstOrDefaultAnalista = data.Personals.FirstOrDefault(p => p.id == reclamo.analista_id);
                if (firstOrDefaultAnalista != null)
                {
                    reclamo.analista_nombre = firstOrDefaultAnalista.nombres;
                    reclamo.analista_apellidos = firstOrDefaultAnalista.apellidos;
                }

                var firstOrDefaultAdministrador = data.Personals.FirstOrDefault(p => p.id == reclamo.administrador_id);
                if (firstOrDefaultAdministrador != null)
                {
                    reclamo.administrador_nombre = firstOrDefaultAdministrador.nombres;
                    reclamo.administrador_apellidos = firstOrDefaultAdministrador.apellidos;
                }
            }

            return reclamo;

        }
        public static DA.Cliente ObtenerCliente(int cliente_id)
        {
            DA.Cliente cliente;
            using(var data = new DA.ReclamosDataContext())
            {
                cliente = data.Clientes.FirstOrDefault(c => c.id == cliente_id);
            }
            return cliente;
        }

        public static List<DA.Reclamo> ListadoReclamo(int punto_venta_id, int? tipo_id, int? estado_id, DateTime? fecha_atencion_inicio)
        {
            List<DA.Reclamo> reclamos;

            using (var data = new DA.ReclamosDataContext())
            {
                reclamos = data.Reclamos.Where(r => r.punto_venta_id == punto_venta_id &&
                                                    r.tipo_id == (tipo_id ?? r.tipo_id) &&
                                                    r.estado_id == (estado_id ?? r.estado_id) &&
                                                    r.fecha_atencion_inicio == (fecha_atencion_inicio ?? r.fecha_atencion_inicio)).OrderBy(r => r.fecha_atencion_final).ThenBy(r => r.fecha_atencion_inicio).ToList();

                foreach (var reclamo in reclamos)
                {
                    var firstOrDefaultCliente = data.Clientes.FirstOrDefault(c => c.id == reclamo.cliente_id);
                    if (firstOrDefaultCliente != null)
                    {
                        reclamo.documento_identidad_numero = firstOrDefaultCliente.documento_identidad_numero;
                        reclamo.nombres = firstOrDefaultCliente.nombres;
                        reclamo.apellidos = firstOrDefaultCliente.apellidos;
                    }

                    var firstOrDefaultTipo = data.Tipo_Reclamos.FirstOrDefault(rt => rt.id == reclamo.tipo_id);
                    if (firstOrDefaultTipo != null)
                    {
                        reclamo.tipo_reclamo_nombre = firstOrDefaultTipo.nombre;
                    }

                    var firstOrDefaultEstado = data.Estado_Reclamos.FirstOrDefault(re => re.id == reclamo.estado_id);
                    if (firstOrDefaultEstado != null)
                    {
                        reclamo.estado_reclamo_nombre = firstOrDefaultEstado.nombre;
                    }

                    var firstOrDefaultPunto_Ventas = data.Punto_Ventas.FirstOrDefault(pv => pv.id == reclamo.punto_venta_id);
                    if (firstOrDefaultPunto_Ventas != null)
                    {
                        reclamo.punto_venta_nombre = firstOrDefaultPunto_Ventas.nombre;
                    }

                    var firstOrDefaultAnalista = data.Personals.FirstOrDefault(p => p.id == reclamo.analista_id);
                    if (firstOrDefaultAnalista != null)
                    {
                        reclamo.analista_nombre = firstOrDefaultAnalista.nombres;
                        reclamo.analista_apellidos = firstOrDefaultAnalista.apellidos;
                    }

                    var firstOrDefaultAdministrador = data.Personals.FirstOrDefault(p => p.id == reclamo.administrador_id);
                    if (firstOrDefaultAdministrador != null)
                    {
                        reclamo.administrador_nombre = firstOrDefaultAdministrador.nombres;
                        reclamo.administrador_apellidos = firstOrDefaultAdministrador.apellidos;
                    }
                }
            }

            return reclamos;
        }

        public static List<DA.Reclamo> ListadoReclamoAdministrador(int? punto_venta_id, int? tipo_id, int? estado_id, DateTime? fecha_atencion_inicio)
        {
            List<DA.Reclamo> reclamos;

            using (var data = new DA.ReclamosDataContext())
            {
                reclamos = data.Reclamos.Where(r => r.punto_venta_id == (punto_venta_id ?? r.punto_venta_id) &&
                                                    r.tipo_id == (tipo_id ?? r.tipo_id) &&
                                                    r.estado_id == (estado_id ?? r.estado_id) &&
                                                    r.fecha_atencion_inicio == (fecha_atencion_inicio ?? r.fecha_atencion_inicio)).OrderBy(r => r.fecha_atencion_final).ThenBy(r => r.fecha_atencion_inicio).ToList();


                foreach (var reclamo in reclamos)
                {
                    var firstOrDefaultCliente = data.Clientes.FirstOrDefault(c => c.id == reclamo.cliente_id);
                    if (firstOrDefaultCliente != null)
                    {
                        reclamo.documento_identidad_numero = firstOrDefaultCliente.documento_identidad_numero;
                        reclamo.nombres = firstOrDefaultCliente.nombres;
                        reclamo.apellidos = firstOrDefaultCliente.apellidos;

                    }

                    var firstOrDefaultTipo = data.Tipo_Reclamos.FirstOrDefault(rt => rt.id == reclamo.tipo_id);
                    if (firstOrDefaultTipo != null)
                    {
                        reclamo.tipo_reclamo_nombre = firstOrDefaultTipo.nombre;
                    }

                    var firstOrDefaultEstado = data.Estado_Reclamos.FirstOrDefault(re => re.id == reclamo.estado_id);
                    if (firstOrDefaultEstado != null)
                    {
                        reclamo.estado_reclamo_nombre = firstOrDefaultEstado.nombre;
                    }

                    var firstOrDefaultPunto_Ventas = data.Punto_Ventas.FirstOrDefault(pv => pv.id == reclamo.punto_venta_id);
                    if (firstOrDefaultPunto_Ventas != null)
                    {
                        reclamo.punto_venta_nombre = firstOrDefaultPunto_Ventas.nombre;
                    }

                    var firstOrDefaultAnalista = data.Personals.FirstOrDefault(p => p.id == reclamo.analista_id);
                    if (firstOrDefaultAnalista != null)
                    {
                        reclamo.analista_nombre = firstOrDefaultAnalista.nombres;
                        reclamo.analista_apellidos = firstOrDefaultAnalista.apellidos;
                    }

                    var firstOrDefaultAdministrador = data.Personals.FirstOrDefault(p => p.id == reclamo.administrador_id);
                    if (firstOrDefaultAdministrador != null)
                    {
                        reclamo.administrador_nombre = firstOrDefaultAdministrador.nombres;
                        reclamo.administrador_apellidos = firstOrDefaultAdministrador.apellidos;
                    }
                }
            }




            return reclamos;
        }

        public static List<DA.Reclamo> ListadoReclamoAnalista(int analista_id, int? tipo_id, int? estado_id, DateTime? fecha_atencion_inicio)
        {
            List<DA.Reclamo> reclamos;

            using (var data = new DA.ReclamosDataContext())
            {
                reclamos = data.Reclamos.Where(r => r.analista_id == analista_id &&
                                                    r.tipo_id == (tipo_id ?? r.tipo_id) &&
                                                    r.estado_id == (estado_id ?? r.estado_id) &&
                                                    r.fecha_atencion_inicio == (fecha_atencion_inicio ?? r.fecha_atencion_inicio)).OrderBy(r => r.fecha_atencion_final).ThenBy(r => r.fecha_atencion_inicio).ToList();


                foreach (var reclamo in reclamos)
                {
                    var firstOrDefaultCliente = data.Clientes.FirstOrDefault(c => c.id == reclamo.cliente_id);
                    if (firstOrDefaultCliente != null)
                    {
                        reclamo.documento_identidad_numero = firstOrDefaultCliente.documento_identidad_numero;
                        reclamo.nombres = firstOrDefaultCliente.nombres;
                        reclamo.apellidos = firstOrDefaultCliente.apellidos;

                    }

                    var firstOrDefaultTipo = data.Tipo_Reclamos.FirstOrDefault(rt => rt.id == reclamo.tipo_id);
                    if (firstOrDefaultTipo != null)
                    {
                        reclamo.tipo_reclamo_nombre = firstOrDefaultTipo.nombre;
                    }

                    var firstOrDefaultEstado = data.Estado_Reclamos.FirstOrDefault(re => re.id == reclamo.estado_id);
                    if (firstOrDefaultEstado != null)
                    {
                        reclamo.estado_reclamo_nombre = firstOrDefaultEstado.nombre;
                    }

                    var firstOrDefaultPunto_Ventas = data.Punto_Ventas.FirstOrDefault(pv => pv.id == reclamo.punto_venta_id);
                    if (firstOrDefaultPunto_Ventas != null)
                    {
                        reclamo.punto_venta_nombre = firstOrDefaultPunto_Ventas.nombre;
                    }

                    var firstOrDefaultAnalista = data.Personals.FirstOrDefault(p => p.id == reclamo.analista_id);
                    if (firstOrDefaultAnalista != null)
                    {
                        reclamo.analista_nombre = firstOrDefaultAnalista.nombres;
                        reclamo.analista_apellidos = firstOrDefaultAnalista.apellidos;
                    }

                    var firstOrDefaultAdministrador = data.Personals.FirstOrDefault(p => p.id == reclamo.administrador_id);
                    if (firstOrDefaultAdministrador != null)
                    {
                        reclamo.administrador_nombre = firstOrDefaultAdministrador.nombres;
                        reclamo.administrador_apellidos = firstOrDefaultAdministrador.apellidos;
                    }
                }
            }


            return reclamos;
        }


        public static List<DA.Personal> ListadoAnalistas()
        {
            List<DA.Personal> analistas;
            using (var data = new DA.ReclamosDataContext())
            {
                //analistas = data.Personals.Where(r => r.es_administrador == false).ToList();
                analistas = data.Personals.ToList();
            }
            return analistas;
        }

        public static List<DA.Estado_Reclamo> ListadoEstados()
        {
            List<DA.Estado_Reclamo> estados;
            using(var data = new DA.ReclamosDataContext())
            {
                estados = data.Estado_Reclamos.ToList();
            }
            return estados;
        }

        public static List<DA.Tipo_Reclamo> ListadoTipos()
        {
            List<DA.Tipo_Reclamo> tipos;
            using(var data = new DA.ReclamosDataContext())
            {
                tipos = data.Tipo_Reclamos.ToList();
            }
            return tipos;
        } 

    }
}
